// Copyright (c) 2024，D-Robotics.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/****************************************************************************
*
*    Copyright (c) 2005 - 2023 by Vivante Corp.  All rights reserved.
*
*    The material in this file is confidential and contains trade secrets
*    of Vivante Corporation. This is proprietary information owned by
*    Vivante Corporation. No part of this work may be disclosed,
*    reproduced, copied, transmitted, or used in any way for any purpose,
*    without the express written permission of Vivante Corporation.
*
*****************************************************************************/


#ifndef __gc_hal_statistics_h_
#define __gc_hal_statistics_h_

#define VIV_STAT_ENABLE_STATISTICS              0

/*  Toal number of frames for which the frame time is accounted. We have storage
 *  to keep frame times for last this many frames.
 */
#define VIV_STAT_FRAME_BUFFER_SIZE              30

/*
 *   Total number of frames sampled for a mode. This means
 *
 *   # of frames for HZ Current  : VIV_STAT_EARLY_Z_SAMPLE_FRAMES
 *   # of frames for HZ Switched : VIV_STAT_EARLY_Z_SAMPLE_FRAMES
 * +
 * --------------------------------------------------------
 *                               : (2 * VIV_STAT_EARLY_Z_SAMPLE_FRAMES) frames needed
 *
 *   IMPORTANT: This total must be smaller than VIV_STAT_FRAME_BUFFER_SIZE
 */
#define VIV_STAT_EARLY_Z_SAMPLE_FRAMES          7
#define VIV_STAT_EARLY_Z_LATENCY_FRAMES         2

/*
 * Multiplication factor for previous Hz off mode.
 * Make it more than 1.0 to advertise HZ on.
 */
#define VIV_STAT_EARLY_Z_FACTOR                 (1.05f)

/* HAL statistics information. */
typedef struct _gcsSTATISTICS_EARLYZ {
    gctUINT                     switchBackCount;
    gctUINT                     nextCheckPoint;
    gctBOOL                     disabled;
} gcsSTATISTICS_EARLYZ;

/* HAL statistics information. */
typedef struct _gcsSTATISTICS {
    gctUINT64                   frameTime[VIV_STAT_FRAME_BUFFER_SIZE];
    gctUINT64                   previousFrameTime;
    gctUINT                     frame;
    gcsSTATISTICS_EARLYZ        earlyZ;
} gcsSTATISTICS;

/* Add a frame based data into current statistics. */
void
gcfSTATISTICS_AddData(IN gceSTATISTICS Key, IN gctUINT Value);

/* Marks the frame end and triggers statistical calculations and decisions.*/
void
gcfSTATISTICS_MarkFrameEnd(void);

/* Sets whether the dynamic HZ is disabled or not .*/
void
gcfSTATISTICS_DisableDynamicEarlyZ(IN gctBOOL Disabled);

#endif /*__gc_hal_statistics_h_ */
